汉诺塔问题--递归版

这篇博客介绍了如何使用递归解决汉诺塔问题。通过将n个碟子从左柱子移动到右柱子,每次只能移动一个且大碟子不能在小碟子上方,递归版本的解决方案将问题分解为更小规模的子问题。文章包含了一个名为HanoiTower1的主函数,该函数利用递归过程实现移动碟子的最小步数并打印每个步骤。
摘要由CSDN通过智能技术生成

问题:有三个柱子放在左中右三个位置,左边柱子上有n个碟子(都不一样大)从上到下按从小到大的顺序叠起来放置,最底下是第n个碟子,最大。现要将n个碟子从左边柱子移动到右边柱子。要求:每次只能移动一个碟子;大碟子不能压在小碟子上;只能往相邻的柱子移动。求移动碟子的最少次数,并输出移动次数最少时的每个移动过程。
这里写图片描述

递归版本

n个碟子的问题可以这么考虑:先将n-1个碟子从左柱子依次移动到中间、右边的柱子,然后将最底下的碟子移到中间,再将n-1个碟子移动回左边,第n个碟子移到右边。如此一来,规模为n的问题就变成了n-1规模的问题,可以采用递归进行求解。

#include<string>
#include<iostream>
using std::string;
using std::cout;
using std::endl;

//用于打印每个移动步骤,num为碟子序号,origin为移动前所在的柱子,dest为移动后所在的柱子
void printStep(int num, string origin, string dest) {
    cout << "Move " << num << " from " << origin << " to " << dest << endl;
}

printStep用于打印每个移动步骤,注意由于移动只能发生在相邻的柱子之间,此函数的发出地,终点也应该是相邻的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值